﻿/**
 * @file:   server.h
 * @brief:
 * @author: 超能
 * @create: 2023/03/25
 * @update: 2023/04/06
 */
#pragma once
#ifndef SERVER_H
#define SERVER_H

#include <event2/util.h>
#include <json/json.h>
#include "chatList.h"
#include "chatDataBase.h"
#include "Utils.h"

#define SERVER_IP "172.29.58.156" // 服务器监听的 IP 地址
#define SERVER_PORT 10086		  // 服务器监听的端口号


class Server {
public:
	Server(const char* ip = nullptr, int port = 10086);
	~Server();

	void startServer();// 启动服务器
	void stopServer(); // 停止服务器
private:
	struct event_base* base;		  // 事件集合
	struct evconnlistener* listener;  // 监听事件
	static const int kMaxConnectionNum = 100;  // 最多同时连接的客户端数量
	static struct bufferevent* bev_list[kMaxConnectionNum];// 缓冲区事件对象列表

	ChatIist* chatList;// 链表对象（含有2个链表）
	static ChatDataBase* chatdb;// 数据库对象
	static Utils* utils;

private:
	// 监听回调函数
	static void listenerCallback(evconnlistener* listener, evutil_socket_t fd,
		struct sockaddr* addr, int socklen, void* arg);
	// 客户端处理函数
	void clientHandler(int fd);
	// 读回调函数
	static void readCallback(struct bufferevent* bev, void* ctx);

	static void writeCallback(struct bufferevent* bev, const void* data, size_t size);
	// 事件回调函数
	static void eventCallback(struct bufferevent* bev, short what, void* ctx);
	// 用户注册函数
	static void registerUser(struct bufferevent* bev, const Json::Value& val);

	static void getClientIp(struct sockaddr* addr);
};

#endif // !SERVER_H
